//***************************************************************************//
//*
//* 内容摘要：系统全局的一些宏定义、TCP消息类型定义等
//*	
//* 当前版本：V1.0		
//* 作    者：zhfayuan
//* 完成日期：2015-12-26
//**************************************************************************//

#ifndef CMD_Protocol_Struct_H
#define CMD_Protocol_Struct_H

//当前支持最大解码显示画面数(单个房间内的最大音视频通道数)
#define		MAX_SUPPORT_DECODE_NUM						9

//系统默认给客户端下发的音视频路数索引
#define		AV_DOWN_MASK_DEFAULT						(0xFFFFFFFFFFFFFFFF & 0x0)

//域服务器附带传送给客户端的候选媒体服务器IP数量
#define		ALL_USABLE_SERIP_FOR_CLIENT					9  


// 功能返回错误码(使用负数)
#define		ERR_PARA									-60				// 参数错误
#define		ERR_PARA_ROOM_ID							-61				// 房间ID参数错误或无效
#define		ERR_PARA_USER_ID							-62				// 用户ID参数错误或无效
#define		ERR_ROOM_FULL								-63				// 房间已经满了
#define		ERR_ROOM_NO_EXSIT							-64				// 房间不存在
#define		ERR_ROOM_CREATE								-65				// 创建房间失败
#define		ERR_ROOM_ADDIN_FAILED						-66				// 加入房间失败		
#define		ERR_ROOM_AVINDEX_CONFLICT					-67				// AV发布者登录失败，请求的索引位置上有其他用户
#define		ERR_ROOM_ONPOSITION_TO_DOMAIN_FAILED		-68				// 通知域服务器，请求上传AV失败		
#define		ERR_PACKET									-69				// 错误的命令包
#define		ERR_VERSION_ERROR							-70				// 客户端版本与服务器不匹配
#define		ERR_GET_USABLE_MEDIA_SERVER_FAILED			-71				// 从域服务器获取可用的媒体服务器IP失败
#define		ERR_ALLOC_AVPORT_FAILED						-72				// 分配端口资源失败
#define		ERR_CREATE_AV_FAILED						-73				// 创建AV资源失败
#define		ERR_CREATE_LOCAL_RES_FAILED					-74				// 创建本地资源失败
#define		ERR_OFFLINE					                -75				// 设备已离线
#define		ERR_CLIENT_OVERT_ROOM_LIMIT			        -76				// 房间人数已超过系统限制
#define		ERR_NO_MEMBER			                    -78				// 未注册的成员
#define		ERR_REPEATED_REQUEST			            -79				// 重复请求
#define		ERR_ALLOC_FAILED			                -80				// 分配对象失败
#define		ERR_CLIENT_OVERT_POSITION_LIMIT			    -81				// 房间人数已超过系统限制
#define		ERR_MEMBER_NOT_EXIST			            -82				// 人员不存在
#define		ERR_HTTP_SERVER			                    -83				// HTTP服务异常
#define		ERR_PROTOCAL			                    -84				// 协议错误
#define		ERR_RETRY			                        -85				// 重试
#define		ERR_CRYPT_HARDWARE			                -86				// 加密硬件异常
#define		ERR_ILLEGAL_SIGN			                -87				// 非法的签名
#define		ERR_SECURE_DENY			                    -88				// 非法的登录,拒绝登录
#define     ERR_KEY_CHECK_FAILED                        -89             // 加密卡检测失败
#define     ERR_INTERNAL_ONLY                           -90             // 只支持内网登录
#define     ERR_DENY_NO_KEY                             -91             // 禁止无KEY登录
#define		ERR_OTHER									-32768			// 其它未知错误


// 客户端SDK被动退出原因
#define		SYS_EXIT_NORMAL								0				// 保留未使用
#define		SYS_EXIT_ABNORMAL							1				// 异常退出 未知原因
#define		SYS_EXIT_LOSTCONNECT						2				// 底层网络原因与服务器断开
#define		SYS_EXIT_KICKED								3				// 用户被KICKED，不应自动重连

// 内部使用的非法UID ROOMID定义
#define		INVALID_CLIENT_INDEX						MAX_UINT32
#define		INVALID_UID2								MAX_UINT32
#define		INVALID_UID1								0x0 
#define		INVALID_ROOMID								0x0

#define     MAX_AV_POSITION                              255

// 终端的类型
#define		TERM_TYPE_OTHER								0  // 其他类型
#define		TERM_TYPE_PC_W								1  // PC-Windows 客户端
#define		TERM_TYPE_PHONE_ANDROID						2  // android客户端
#define		TERM_TYPE_PHONE_IOS							3  // iphone客户端
#define		TERM_TYPE_PC_B								4  // PC-B浏览器
#define		TERM_TYPE_PAD_ANDROID						5  // android pad客户端
#define		TERM_TYPE_PAD_IOS							6  // iphone pad客户端

#define     TERM_TYPE_DEV_OTHRER                        7
#define     TERM_TYPE_DEV_ANDROID                       8
#define     TERM_TYPE_DEV_IOS                           9
#define     TERM_TYPE_DEV_HISI                          10
#define     TERM_TYPE_DEV_MULTI_DECODER                 11
#define     TERM_TYPE_DEV_MCU_PROXY                     12
#define     TERM_TYPE_GB28181_SVR                       13

// 用户类型
#define		USER_TYPE_OTHER								0  //其他类型
#define		USER_TYPE_AV_SEND_RECV						1  //音视频收发类型
#define		USER_TYPE_AV_RECV_ONLY						2  //仅接收音视频类型
#define		USER_TYPE_AV_SEND_ONLY						3  //仅发送音视频类型

// 网络类型
#define		OPERATOR_OTHER								0  // 其他类型
#define		OPERATOR_CHINANET_HN						1  // 电信MAINT-CHINANET
#define		OPERATOR_MAINT_CNCGROUP						2  // 网通MAINT-CNCGROUP
#define		OPERATOR_MAINT_CN_CMCC						3  // 移动MAINT-CN-CMCC
#define		OPERATOR_MAINT_CNNIC						4  // 铁通MAINT-CNNIC
#define		OPERATOR_PRIVATE_IP							5  // 私IP地址
#define		OPERATOR_BGP_IP								6  // 双线类型


// 用户发送的音视频类型
#define		MEMBER_DATA_TYPE_RESERVE					1  // 暂未使用本类型
#define		MEMBER_DATA_TYPE_ROOM						2  // 房间内广播
#define		MEMBER_CMD_TYPE_P2P_INFO					3  // 用户客户端和服务器之间交互P2P所需信息
#define		MEMBER_CMD_TYPE_P2P_HANDLE					4  // 用户客户端P2P之间握手
#define		MEMBER_CMD_TYPE_P2P_STATIS					5  // 客户端上报P2P状态下的丢包率等统计信息	
#define		MEMBER_DATA_TYPE_INVALID					6  // 非法类型，特殊用途比如告知线程退出等


// 服务器信令下发类型
#define		BROADCAST_TYPE_DOWN							1  // 只向本服务器下的客户端下发
#define		BROADCAST_TYPE_SRC							2  // 向所有该房间内的用户广发（包括登录于其他服务器上的该房间用户）


// 媒体服务器类型
#define		MEDIA_SERVER_TYPE_AV_MIXER					1  // 转码服务器(负责多画面合成和音频混音)
#define		MEDIA_SERVER_TYPE_AV_PLAYER					2  // 转发服务器
#define		MEDIA_SERVER_TYPE_RTMP_ONLY					3  // 专门用于RTMP推送, 上面不会登录客户端
#define		MEDIA_SERVER_TYPE_TS_ONLY					4  // 专门用于TS流录制，上面不会登录客户端
#define		MEDIA_SERVER_TYPE_INVALID					5  // 非法类型

#define     VIDEO_CODEC_NONE                            0
#define     VIDEO_CODEC_H264                            1
#define     VIDEO_CODEC_H265                            2

#define     AUDIO_CODEC_NONE                            0
#define     AUDIO_CODEC_ADTS                            1
#define     AUDIO_CODEC_PCM                             2
#define     AUDIO_CODEC_ADPCM                           3
#define     AUDIO_CODEC_OPUS                            4

#define     EXTRA_CODEC_NONE                            1

#define     PROTOCOL_NONE                            0
#define     PROTOCOL_JSON                            1
#define     PROTOCOL_PROTOBUF                        2

#define     CRYPT_NONE                              0
#define     CRYPT_AES128                            1 
#define     CRYPT_AES128_OFB                        2
#define     CRYPT_SM2                               3 
#define     CRYPT_SM4                               4 
#define     CRYPT_SM4_OFB                           5 
#define     CRYPT_XOR                               6
#define     CRYPT_XOR_VEK_KEY                       7
#define     CRYPT_XOR_AES_KEY                       8


//**************************************************端口管理******************************************************//
//
//************************************************系统能力相关的定义**********************************************//
#define		MAX_CLIENT_LOGIN_SERVER_THREADS				4		//域服务器上同时为客户端登录服务的并发线程数
#define		MAX_DOMAIN_INDEX_NUM						10		//系统最多支持的域数目
#define		MAX_MSGSER_IN_DOMAIN						25		//同一个域中最大支持的媒体服务器数目
#define		MAX_USABLE_IP_FOR_ONE_SERVER				4		//单个服务器最多可用IP个数
#define		MAX_NUM_MEMBER_PER_ROOM						1024	//单个房间最大用户数(同一个房间可以跨多台媒体服务器)
#define		MAX_NUM_MEMBER_PER_SERVER					400		//单台服务器最大允许客户端数目
#define		MAX_ROOM_NUM_SUPPORT						300		//系统最大支持的房间数
#define		MAX_NALU_NUM_PER_FRAME						1024	//一帧码流最大允许的NALU数

#define		ENABLE_MSGSER_P2P							1		//是否使能媒体服务器之间的P2P功能，目前必须开启
#define		ENABLE_RTMP_SEND							0		//是否开启媒体服务器到指定流媒体服务器的RTMP流推送功能
#define		ENABLE_TS_MUXER								1		//是否开启TS文件录制功能
#define		DEFAULT_DOMAIN_INDEX_NUM					1		//默认的域索引值，域索引值从配置文件中读取
#define		ENABLE_AUDIO_MIX							0		//是否使能服务器端混音功能
#define		ENABLE_PROXY_MODE							1		//域服务器是否使用代理模式	
#define		ENABLE_PING_SERVICE						    0		//是否启用 TELNET 服务

//****************************************************TCP*********************************************************//
#define		ONLIEN_MEDIASERVER_PORT						10000	//客户端连接媒体服务器上的TCP端口
#define		ONLIEN_MEDIASERVER_PORT_STEP				100	

#if ENABLE_PING_SERVICE
#define		PING_MEDIASERVER_PORT_OFFSET				1	//客户端掉线重连时, 用于ping 媒体服务器是否在线的端口
#define		PING_DOMAINSERVER_PORT_OFFSET			    2	//媒体服务器掉线重连时, 用于ping 域服务器是否在线的端口
#define		PING_PORT_STEP								100	
#endif

#define		ONLIEN_DOMAINSERVER_PORT_OFFSET			    3	//媒体服务器连接域服务器上的TCP端口
#define		ONLIEN_DOMAINSERVER_PORT_STEP				100

#define		TELNET_DOMAINSERVER_PORT_OFFSET				4	//连接域服务器的Telnet端口
#define		TELNET_MEDIASERVER_PORT_OFFSET			    5	//连接媒体服务器的Telnet端口[MEDIA_SERVER_TYPE_AV_MIXER or MEDIA_SERVER_TYPE_AV_PLAYER]
#define		TELNET_RTMPSERVER_PORT_OFFSET				6	//连接RTMP推送服务器的Telnet端口
#define		TELNET_TSSERVER_PORT_OFFSET					7	//连接TS录制媒体服务器的Telnet端口
#define		TELNET_PORT_STEP							100		

#define		KEEPLIVE_DOMAINSERVER_PORT_OFFSET		    8	//外部监控进程监听的Domain端口，当该端口无法connect时，监控进程将重启服务
#define		KEEPLIVE_MEDIASERVER_PORT_OFFSET		    9	//外部监控进程监听的Media端口，当该端口无法connect时，监控进程将重启服务
#define		KEEPLIVE_RTMPSERVER_PORT_OFFSET			    10 
#define		KEEPLIVE_TSSERVER_PORT_OFFSET			    11
#define		KEEPLIVE_PORT_STEP							100		


#define		PROXYSERVER_TELNET_PORT				       20000	//连接TS录制媒体服务器的Telnet端口


//****************************************************UDP*********************************************************//
#define		DOMAINSERVER_ONLINE_PORT				10000	//客户端连接域服务器上的UDP端口，用于在登陆媒体服务器前获得可选的登陆IP集合
//为了避免出现瓶颈，域服务器上不仅仅在这一个端口上等待来自客户端的UDP请求信令
//而是在包括DOMAINSERVER_ONLINE_PORT、DOMAINSERVER_ONLINE_PORT + n*DOMAINSERVER_ONLINE_PORT_STEP的端口上监听
//客户端在登陆时，从其中随机选择一个端口。
#define		DOMAINSERVER_ONLINE_PORT_STEP			100		//不同域之间在起始端口上的偏移步长
#define		DOMAINSERVER_ONLIEN_RANDOM_STEP			1		//端口递增步长
#define         MEDIASERVER_UDP_BASE_PORT                30000 ////客户端连接媒体服务器时使用的测速UDP端口,会用到MSGSER_CONNECTIVITYTEST_PORT和MSGSER_CONNECTIVITYTEST_PORT+1 两个端口
#define         MEDIASERVER_UDP_PORT_SETP                10000 ///不同域之间在起始端口上的偏移步长



//******************************************************************************************************************************/

#define		MAX_PAYLOAD_LEN								2048
#define		RANDOM_CODE_FOR_NET							0xFAAB1010	
//#define     MSG_CMD_RET_OFFSET							10000	// 同步命令的返回偏移值



// 音视频包的私有头
typedef struct stAVPACK_HEAD
{
    UINT64      unSrcUid;					//源对象
    UINT64      unDesUid;					//目标对象
    UINT        unToken;                    //记录加密的Token
    UINT        unDataLen;					//负载中有效数据长度
    UINT		unPTS;						//PTS时间戳
    UINT		unDTS;						//DTS时间戳（视频Bframe)
    //视频专用
    UINT        unFrameIndex;				//当前帧号
    USHORT      usNALUNum;					//当前帧中NALU的数量
    USHORT      usNALUIndex;				//当前NALU序号
    BYTE        byType;						//包类型：房间内广播 or 私人通讯
    BYTE		byIndex;					//一个房间多路音视频时，每路视频依靠这个作为区别和定位，最多支持16路AV流
    BYTE		byFuaMode;					//NALU是否为FU-A分包传输模式  0--Single模式（每个包是一个独立的NALU）  1--FU-A模式（NALU大于MTU，需要拆分发送的情况）	
    BYTE        byCodec;                    //媒体编码类型
    BYTE        byCrypto;                   //媒体数据加密方法
	BYTE		byIsKey;                    //是否是关键帧
    BYTE        byReserve[4];				//保留字段, 方便以后扩展[0]:音视频,[1]:padding
}AVPACK_HEAD;


typedef struct stAVPACK
{
    AVPACK_HEAD head;
    BYTE        byData[MAX_PAYLOAD_LEN];
}AVPACK;


//描述本端P2P的状态
typedef enum E_P2P_Status{
    //Turn转发模式
    e_P2P_UNUSABLE = 0,
    //P2P收发
    e_P2P_SEND_AND_RECV,
    //仅使用P2P发送
    e_P2P_ONLY_SEND,
    //仅使用P2P接收
    e_P2P_ONLY_RECV,
    //P2P状态下传输质量不满足要求，切换回转发模式
    e_P2P_FORCE_TRUN
}E_P2P_Status;

typedef struct stIpInfo
{
    UINT unUid;
    UINT unLocalIp;
    UINT unNatVideoIp;
    UINT unNatAudioIp;
    UINT unRandomCode;

    USHORT usLocalVideoPort;
    USHORT usLocalAudioPort;
    USHORT usNatVideoPort;
    USHORT usNatAudioPort;

    //附带上报当前P2P状态
    USHORT usP2PMode;
    USHORT usP2PLocal;
    USHORT usP2PEnable;

    //附带下行通知客户端强制使用转发模式
    USHORT usForceTrunMode;
}IPinfoForP2P;

typedef enum E_P2P_Channel
{
    e_P2P_LOCAL_CHAN = 0,
    e_P2P_NAT_CHAN
}E_P2P_Channel;

typedef struct stHandleForP2P
{
    //本握手包使用Local还是Nat通道发送
    UINT unChannelType;
    //是否接收到对端通过Local发送的握手包
    UINT unRecvPeerLocalChannel;
    //是否接收到对端通过Nat发送的握手包
    UINT unRecvPeerNatChannel;
    //随机码
    UINT unRandomCode;
}HandleForP2P;


typedef struct stP2PStatisInfo
{
    USHORT usUpAudioBitrate;
    USHORT usUpVideoBitrate;
    USHORT usDownAudioBitrate;
    USHORT usDownVideoBitrate;

    USHORT usUpAudioLostrate;
    USHORT usUpVideoLostrate;
    USHORT usDownAudioLostrate;
    USHORT usDownVideoLostrate;

    UINT unRandomCode;

}StatisInfoForP2P;

//域服务器代理模式下用于与代理交互时前缀头
typedef struct IMProxyMessageHeader
{
    UINT Flag;					// FLAG     (客户端填充)
    UINT CMD;					// 命令ID   (客户端填充)
    UINT IP;					// 用户IP   (代理服务填充)
    unsigned short Port;		// 用户端口 (代理服务填充)
    UINT ProxyIP;				// 代理的UDP IP(代理服务填充)
    unsigned short ProxyPort;	// 代理的UDP 端口(代理服务填充)
    UINT DataSize;				// 数据长度 (客户端填充)
}IMPMH,*LPIMPMH;


// 客户端连接域服务器UDP发送本消息，以查询候选媒体服务器IP地址集
typedef struct ClientLogReqInfo
{
#if ENABLE_PROXY_MODE
    IMPMH tProxyHead;
#endif
    //UINT   unRoomID;										//房间ID
    UINT   unUserType;										//用户类型
    UINT   unTerminalType;									//客户端类型(PC or Anroid or IOS...)
    UINT   unNetworkType;									//用户网络类型，如果已知的话可以传入，避免服务器查询IP地址库开销
    //UINT   unUid;											//用户ID	
    UINT   unLoginCode;										//标示本次登录的随机数
    UINT   unRandomCode;									//包合法性的校验随机数
}ClientLogReqInfo;

//连接域服务器时，域服务器返回给客户端的相关信息，比如候选媒体服务器IP地址集合等
typedef struct stUplinkSerInfo
{
#if ENABLE_PROXY_MODE
    IMPMH tProxyHead;
#endif

    UINT   unRecommendIp;										//域服务器推荐的媒体服务器IP地址,为0分配失败
    UINT   unClientPublicNetType;								//客户端公网网络类型
    UINT   unClientPublicNetAreaId;								//客户端公网网络区域id号
    UINT   aunUsableIps[ALL_USABLE_SERIP_FOR_CLIENT];			//客户端可用的媒体服务器IP地址集和相关运营商类型、地域位置	
    UINT   aunUsableIpTypes[ALL_USABLE_SERIP_FOR_CLIENT];			
    UINT   aunUsableNetAreaId[ALL_USABLE_SERIP_FOR_CLIENT];			
    UINT   unRandomCode;
    UINT   unOther;												//保留位
}UplinkSerInfo;


//媒体服务器基本信息[保障字节对齐]
typedef struct stServerBaseRunPar
{
    UINT	unCurLinkCnt;          // 当前的连接数【基于性能考虑，未加锁保护，不保证绝对精度】
    UINT    unMaxLinkCnt;          // 最大连接总数
    UINT	unSerEnthPortRate;     // 服务器出口带宽
    UINT	unSerType;			   // 服务器类型: 具体见MEDIA_SERVER_TYPE宏定义

    UINT    unPubChinaNetIp;       // 服务器对外的电信公IP地址
    UINT    unPubChinaUnicomIp;    // 服务器对外的联通公IP地址
    UINT    unChinaMobile;         // 服务器对外的移动公IP地址
    UINT    unCnnicIp;             // 服务器对外的铁通公IP地址
    UINT	unBgpIp;			   // 服务器对外的BGP公网IP地址 

    UINT	unServerId;			   // 服务器在数据库服务器列表中的id
} ServerBaseRunPar;


#if ENABLE_MSGSER_P2P
typedef struct MsgSerIpPortIndex
{
    //暂认为服务器只有单线和双线两种
    UINT unIPFrist;
    UINT unIPSecond;
    UINT unIPNetTypeFrist;
    UINT unIPNetTypeSecond;
    //该媒体服务器的唯一索引值，用于分配P2P端口号
    UINT unP2PIndex;
    //该媒体服务器的类型
    UINT unServerType;
} MsgSerIpPortIndex;
#endif


//房间属性
typedef struct SDDomainRoom
{
    UINT		   unVersion;		   //当前域服务器上的房间属性版本，媒体服务器根据该版本判断是否需要更新
    UINT           unRoomId;           // 房间Id号
    UINT		   aunAvProvidersId[MAX_SUPPORT_DECODE_NUM]; //房间音视频发布者ID
    USHORT		   ausMemberNumOnThisServer[MAX_MSGSER_IN_DOMAIN + 1]; //记录房间在该服务器上的用户数	
} SDDomainRoom;

typedef struct SDMediaRoomMemberInfo
{
    UINT			unRoomId;
    UINT			unMemberCount;
}SDMediaRoomMemberInfo;




//客户端登录媒体服务器时上报的消息信息
typedef struct stCmdOnlineRequest
{
    //UINT    unUid;
    //UINT    unRoomId;
    UINT	unBaseVersion;		//客户端使用的中间件版本信息，服务器可根据它做兼容性判断
    BYTE	byStudioType;		//保留
    BYTE    byTermType;			//终端类型
    BYTE    byUserType;			//用户类型
} CmdOnlineRequest;


//客户端登录媒体服务器时上报的消息信息
typedef struct stCmdOnPositionRequest
{
    //UINT    unUid;
    //UINT    unRoomId;
    UINT	unBaseVersion;		//客户端使用的中间件版本信息，服务器可根据它做兼容性判断
    BYTE	byStudioType;		//保留
    BYTE    byTermType;			//终端类型
    BYTE    byUserType;			//用户类型
} CmdOnPositionRequest;


//************************************************TCP信令类型**********************************************//
#define   MSG_CMD_RESERVED						 0		// 客户端登录

#define   MSG_CMD_HANDSHAKE						 1		// 客户端登录

#define   MSG_CMD_BYE						     2		// 客户端下线

#define   MSG_CMD_SET_USER_STATUS				 3		// 设置用户状态

#define   MSG_CMD_GET_USER_STATUS				 4		// 获取用户状态

#define   MSG_CMD_SET_USER_TYPE					 5		// 设置用户类型

#define   MSG_CMD_GET_USER_TYPE					 6		// 获取用户类型

#define   MSG_CMD_SET_USER_AV_TRANS_STATUS		 7		// 使用掩码方式设置音视频各通道下行状态

#define   MSG_CMD_HEART_BEAT					 9		// 定时心跳握手


#define   MSG_CMD_SET_ROOM_STATUS				 26		// 设置房间状态 

#define   MSG_CMD_BROADCAST						 30		// 广播消息的大类

#define   MSG_CMD_CUSTOM_MESSAGE				 43		// 用户自定义消息

#define   MSG_CMD_REGISTER_MEDIA_SERVER_INFO	 57		//媒体服务器上线，注册到域服务器

#define   MSG_CMD_UNREGISTER_MEDIA_SERVER_INFO   58		//媒体服务器下线

#define   MSG_CMD_GET_ROOM_PROPERTY				 62		// 媒体服务器上还没有指定的房间时,向域服务器取得某个房间的属性

#define   MSG_CMD_SEND_CONNECTIVITY              86		// 联通性测试请求

#define   MSG_CMD_REC_CONNECTIVITY				 87		// 联通性测试请求

#define   MSG_CMD_UPDATE_P2P_TABLE				 93		//通知域服务器下的各媒体服务器，更新P2P IP-端口索引表，在域服务器上有媒体服务器上下线时触发

#define   MSG_CMD_ASK_SERVER_USE_TCP_FOR_AVDOWN  95		//要求服务器使用TCP模式给本客户端下发音视频数据

#define   MSG_CMD_GET_USEABLE_MEDIA_IPS			 100	//UDP方式从域服务器获取可用的IP地址集

#define   MSG_CMD_AVPROVIDE_LOGON_NOTIFY         101	// AVProvider上线后在房间内广播通知消息

#define   MSG_CMD_AVPROVIDE_LOGOFF_NOTIFY		 102	// AVProvider下线后在房间内广播通知消息

#define   MSG_CMD_AVPROVIDE_ON_POSITION			 103	// AVProvider请求进入指定位置发送音视频

#define   MSG_CMD_AVPROVIDE_OFF_POSITION		 104	// AVProvider请求离开指定位置

#define   MSG_CMD_USER_WAS_KICKED				 105	// 用户被顶下去

#define	  MSG_CMD_UPDATE_ROOM_PROPERTY			 106	// 域服务器通知媒体服务器更新某个房间的状态	

#define	  MSG_CMD_NOTIFY_PEER_USE_P2P			 107	// 客户端启用P2P模式时，特定情况下需要通过TCP通道通知对方

#define	  MSG_CMD_NOTIFY_FORCE_TRUN_MODE		 108	// 客户端通知服务器，请求从P2P方式切换到转发模式

#define   MSG_CMD_PRIVATE_VOD_PLAY              109     //客户端请求开始私有文件点播
#define   MSG_CMD_PRIVATE_VOD_SEEK              110     //客户端请拖动私有播放
#define   MSG_CMD_PRIVATE_VOD_PAUSE             111     //客户端请求私有点播暂停 
#define   MSG_CMD_PRIVATE_VOD_CONTINUE          112     //客户端请求私有点播恢复播放
#define   MSG_CMD_PRIVATE_VOD_STOP              113     //客户端请求点播结束
#define   MSG_CMD_PRIVATE_VOD_SERVER_REPLY      114     //服务器返回点播状态

#define   MSG_CMD_CRYPT_AUTH_STATE_0            120     //服务器返回点播状态
#define   MSG_CMD_CRYPT_AUTH_STATE_1            121     //服务器返回点播状态
#define   MSG_CMD_CRYPT_AUTH_STATE_2            122     //服务器返回点播状态
#define   MSG_CMD_CRYPT_AUTH_STATE_3            123     //服务器返回点播状态

#define   MSG_CMD_CRYPT_GET_DEC_KEY             124     //获取指定用的解码秘钥

//#define   MSG_CMD_IDR_REQUEST                     113     //服务器返回点播状态

#define   MSG_CMD_YS_CUSTOM_MESSAGE_START		 200		// 定时心跳握手
#define   MSG_CMD_YS_CUSTOM_MESSAGE_END		 400		// 定时心跳握手

#define   MSG_CMD_YS_LOGIN                      (MSG_CMD_YS_CUSTOM_MESSAGE_START + 0)
#define   MSG_CMD_YS_LOGOUT                     (MSG_CMD_YS_CUSTOM_MESSAGE_START + 1)
#define   MSG_CMD_YS_GPS                        (MSG_CMD_YS_CUSTOM_MESSAGE_START + 100)

#define   PRIVATE_FILE_OPEN_FAILED               0  // 私有文件打开失败
#define   PRIVATE_FILE_OPEN_SUCCESS              1  // 私有文件打开成功
#define   PRIVATE_FILE_COMPLETE_SUCCESS          2  //私有文件正常播放完成

#define   STREAM_TYPE_LIVE   0
#define   STREAM_TYPE_INTECOM   1
#define   STREAM_TYPE_METTING   2


//#define	  MSG_CMD_CUSTOM0_MESSAGE_OFFSET		 200	// 客户端通知服务器，请求从P2P方式切换到转发模式
#endif // CMD_Protocol_Struct_H
